package Api.JunKa.RedeemJunKa;

import Util.HttpUtil;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class CardPayQueryDemo {

    // 接口相关配置，和之前场景保持一致的商户信息
    private static final String QUERY_URL = "https://query.Heepay.com/Api/CardPayQueryService.aspx";
    private static final String AGENT_ID = "1664502"; // 商户编号，七位整数数字
    private static final String MD5_KEY = "651886F030134F848F548A12"; // 假设和之前场景密钥一致，实际以文档为准
    // 时间戳格式：yyyyMMddHHmmss ，4位年+2位月+2位日+2位时+2位分+2位秒，不足14位用0补齐
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

    public static void main(String[] args) {
        try {
            // 1. 准备业务参数
            String billId = "20250825095910"; // 商户系统内部订单号，需保证唯一，长度 6 - 50 位
            String timeStamp = generateTimeStamp(); // 生成符合格式的时间戳

            // 2. 生成签名
            String sign = generateSign(AGENT_ID, billId, timeStamp, MD5_KEY);

            // 3. 组装请求参数
            Map<String, String> params = new HashMap<>();
            params.put("agent_id", AGENT_ID);
            params.put("bill_id", billId);
            params.put("time_stamp", timeStamp);
            params.put("sign", sign);

            // 4. 发送请求（假设 HttpUtil.sendPost 是发送 POST 请求的工具方法，返回响应结果）
            String response = HttpUtil.sendPost2(QUERY_URL, params);
            System.out.println("接口返回结果：" + response);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成符合格式的时间戳（yyyyMMddHHmmss ，不足14位用0补齐 ）
     * @return 时间戳字符串
     */
    private static String generateTimeStamp() {
        Date now = new Date();
        String formatTime = sdf.format(now);
        // 理论上 SimpleDateFormat 按该格式生成的就是 14 位，这里做简单兜底，若不足补 0（实际一般不会出现）
        if (formatTime.length() < 14) {
            formatTime = String.format("%-" + 14 + "s", formatTime).replace(' ', '0');
        }
        return formatTime;
    }

    /**
     * 按照文档规则生成签名
     * 签名规则：sign=MD5(agent_id=**&bill_id=**&time_stamp=***|||md5Key)
     * @param agentId 商户编号
     * @param billId 商户订单号
     * @param timeStamp 时间戳
     * @param md5Key MD5 密钥
     * @return 签名结果
     * @throws Exception 异常情况
     */
    private static String generateSign(String agentId, String billId, String timeStamp, String md5Key) throws Exception {
        StringBuilder signStr = new StringBuilder();
        signStr.append("agent_id=").append(agentId)
                .append("&bill_id=").append(billId)
                .append("&time_stamp=").append(timeStamp)
                .append("|||").append(md5Key);

        // 使用标准 MD5 算法（编码为 UTF-8）生成签名
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(signStr.toString().getBytes("UTF-8"));
        StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                result.append("0");
            }
            result.append(hex);
        }
        return result.toString();
    }
}